package com.class04.advice;

import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

/**
 * @ClassDescription:增强类的内部要存储增强类代码
 * 1、定义方法存储增强代码
 *    具体定义几个方法，根据插入的位置决定！
 * 2、使用注解配置，指定插入目标方法的位置
 *   前置   @Before
 *   后置   @AfterReturning
 *   异常   @AfterThrowing
 *   最后   @After
 *   环绕   @Around
 *   try{
 *       前置
 *       目标方法执行
 *       后置
 *   }catch(){
 *       异常
 *   }finally{
 *       最后
 *   }
 *   3、配置切点表达式 [选中出入的方法   切点]
 *   4、补全注解
 *   加入ioc容器  @Component
 *   配置切面 @Aspect  = 切点  + 增强
 *   spring  aop  重点是 配置   -> jdk  |  cglib
 *   5、开启aspect注解的支持
 *
 *
 *
 *
 *
 * @JdkVersion: 17
 * @Author: yxy
 * @Created: 2023/11/2 10:55
 */
//@Aspect
//@Component
//@Order(1)
public class LogAdvice {

    /*
    * todo ：切点表达式
    *  固定语法  execution(1  2  3  4  5  6)
    * 1、访问修饰符
    * public / private
    * 2、方法的返回参数类型
    * String  int  void
    * 如果不考虑访问修饰符和返回值！这两位可以整合成一起写成  *
    * 如果要是不考虑，必须两个都不考虑！不能出现  * String
    * 3、包的位置：
    * 3.1、具体包：
    * com.class04.service.impl
    * 3.2、单层模糊：
    * com.class04.service.*
    * 3.3、多层模糊：
    * com..impl   ..任意层的模糊
    * 3.3.1细节：  ..不能开头
    * 找所有impl包：com..impl  不能写:...impl   写成：*..impl
    * 4、类的名称
    * 具体：CalculatorPureImpl
    * 模糊：*
    * 部分模糊：*Impl
    * 5、方法名  语法和类名一致
    *  具体：add
    *  模糊：*
    *  部分模糊：*d
    * 6、(6)形参数列表
    * 6、1:没有参数:()
    * 6、2:有具体参数：(String)  (String,int)
    * 6.3:模糊参数(..) 有没有参数都可以，有多个也可以！
    * 6.4:部分模糊:(String ...)后面有没有无所谓
    *             (...int)最后一个参数是int,前面有没有无所谓
    *             (String .. int)中间做模糊
    *   1.查询某包某类下，访问修饰符是公有，返回值是int的全部方法
    *   public int *..xx.*.*(..)
        2.查询某包下类中第一个参数是String的方法
         public int xx.xx.jj.*(String..)
        3.查询全部包下，无参数的方法！
        * *..*.*()
        4.查询com包下，以int参数类型结尾的方法
        * com..*.*(..int)
        5.查询指定包下，Service开头类的私有返回值int的无参数方法
        * private int xx.xx.Service*.*()
    *
    * */
    @Before("com.class04.pointcut.MyPointCut.pc()")
    public void start(){
        System.out.println("LogAdvice方法做了前置通知");
    }
    @AfterReturning("com.class04.pointcut.MyPointCut.pc()")
    public void afterReturning(){
        System.out.println("LogAdvice方法做了后置通知");
    }
    @After("com.class04.pointcut.MyPointCut.pc()")
    public void after(){
        System.out.println("LogAdvice方法做了最后通知");
    }


    @AfterThrowing("execution(public int *..*Impl.add(int,int))")
    public void error(){
        System.out.println("方法错误了");
    }
}
